/*
    热点管理模块：
        对上传的⽂件每隔⼀段时间进⾏热点检测，相当于遍历上传⽂件的存储⽂件夹，找出所有
        的⽂件，然后通过对逐个⽂件进⾏时间差的判断，来逐个进⾏热点处理。
        上传⽂件有⾃⼰的上传存储位置，⾮热点⽂件的压缩存储有⾃⼰的存储位置
        遍历上传存储位置⽂件夹，获取所有⽂件信息。
        获取每个⽂件最后⼀次访问时间，进⽽完成是否热点⽂件的判断。
        对⾮热点⽂件进⾏压缩存储，删除原来的未压缩⽂件。
*/

#ifndef __M_CHOT_H__
#define __M_CHOT_H__
#include"Cdata.hpp"
#include<unistd.h>

extern Hxy_Cloud::DataManager* _data;

namespace Hxy_Cloud
{
    class HotManager
    {
        public:
            HotManager()
            {
                Hxy_Cloud::Config* conf = Hxy_Cloud::Config::GetInstance();
                _back_dir = conf->GetBackDir();
                _pack_dir = conf->GetPackDir();
                _pack_suffix = conf->GetPackFileSuf();
                _hot_time = conf->GetHotTime();
                Hxy_Cloud::FileUtil fu1(_back_dir);
                Hxy_Cloud::FileUtil fu2(_pack_dir);
                fu1.CreateDirectory();
                fu2.CreateDirectory();
            }
            bool RunModule()
            {
                while(1)
                {
                    //1.将备份文件目录里面的文件全都提取
                    Hxy_Cloud::FileUtil fu(_back_dir);
                    std::vector<std::string> paths;
                    fu.GetDirectorys(&paths); //提取所有文件路径
                    //2.判断是非是非热点文件
                    for(auto path : paths)
                    {
                        if(_HotJudge(path)) //是热点文件返回true  热点文件不需要处理
                            continue;
                        //获取当前路径文件的备份信息
                        Hxy_Cloud::BackUpInfo info;
                        if(_data->GetOnrByRealPath(path,&info) == false)
                        {
                            //获取失败证明有当前路径但是没有备份信息
                            info = Hxy_Cloud::BackUpInfo(path);/////////////////
                        }
                        //3.把非热点文件进行压缩 -- 走到这是非热点文件，进行对文件数进行压缩
                        Hxy_Cloud::FileUtil unhot(path);
                        unhot.Compress(info.pack_path);
                        //4.删除源文件，修改备份信息
                        unhot.RemoveFile();
                        info.is_pack = true;
                        _data->Update(info);
                    }
                    usleep(1000);   //避免空目录循环遍历消耗cpu资源过高
                }
            }
        private:
            bool _HotJudge(const std::string filename)
            {
                Hxy_Cloud::FileUtil fu(filename);
                time_t atime = fu.LastATime();
                time_t cur = time(nullptr);
                if(cur - atime > _hot_time)
                    return false;   //如果当前时间 - 最近一次访问时间 > 热点时间间隔 -》 则为非热点文件
                return true;
            }
        private:
            std::string _back_dir;  //备份文件路径
            std::string _pack_dir;  //压缩包路径
            std::string _pack_suffix; //压缩包后缀
            time_t _hot_time;   //热点时间
    };
}

 
#endif